package com.kukudexin.demo;

import com.jfinal.config.*;
import com.jfinal.kit.Prop;
import com.jfinal.kit.PropKit;
import com.jfinal.kit.StrKit;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.druid.DruidPlugin;
import com.jfinal.server.undertow.UndertowServer;
import com.jfinal.template.Engine;
import com.kukudexin.demo.entity.User;
import com.kukudexin.demo.router.AdminRouter;
import com.kukudexin.demo.util.MyDbPro;

public class DemoConfig extends JFinalConfig {
    /**
     * 注意：用于启动的 main 方法可以在任意 java 类中创建，在此仅为方便演示
     *      才将 main 方法放在了 DemoConfig 中
     *
     *      开发项目时，建议新建一个 App.java 或者 Start.java 这样的专用
     *      启动入口类放置用于启动的 main 方法
     */
    public static void main(String[] args) {
        UndertowServer.start(DemoConfig.class, 80, true);
    }

    @Override
    public void configConstant(Constants me) {
        /**
         * 第一次使用use加载得到的配置将会成为主配置。可以通过propkit.get()
         * 非第一次使用use加载的配置需要通过每次使用use来指定文件名再来取值
         * 或者得到prop 对象之后通过对象取值
         */
        Prop prop = PropKit.use("config.txt");
        me.setDevMode(PropKit.getBoolean("devMode"));
        // 开启对 jfinal web 项目组件 Controller、Interceptor、Validator 的注入
        me.setInjectDependency(true);
        // 开启对超类的注入。不开启时可以在超类中通过 Aop.get(...) 进行注入
        me.setInjectSuperClass(true);

        // 4.6 之前的版本的配置方式: me.setProxyFactory(new CglibProxyFactory());
        me.setToCglibProxyFactory();  // 4.6 版本新增配置方式
    }
    @Override
    public void configRoute(Routes me) {
        // 如果要将控制器超类中的 public 方法映射为 action 配置成 true，一般不用配置
        me.setMappingSuperClass(false);

        // 配置 baseViewPath，可以让 render(...) 参数省去 baseViewPath 这部分前缀
//        me.setBaseViewPath("/view");

        // 配置作用于该 Routes 对象内配置的所有 Controller 的拦截器
//        me.addInterceptor(new FrontInterceptor());

        // 路由扫描，jfinal 4.9.03 新增功能。参数 "com.xxx." 表示扫描被限定的包名，
        // 扫描仅会在该包以及该包的子包下进行
        me.scan("com.kukudexin.demo.controller.");
        // 手工添加路由。注意：使用了路由扫描就不要再使用手工添加路由，两者选其一
//        me.add("/hello", HelloController.class);
        me.add(new AdminRouter());
    }
    @Override
    public void configEngine(Engine me) {
//        me.addSharedFunction("/view/common/layout.html");
//        me.addSharedFunction("/view/common/paginate.html");
//        me.addSharedFunction("/view/admin/common/layout.html");
        // devMode 配置为 true，将支持模板实时热加载
        me.setDevMode(true);
        Engine.setFastMode(true);
        me.addSharedMethod(new StrKit());
    }
    @Override
    public void configPlugin(Plugins me) {
        DruidPlugin dp = new DruidPlugin("jdbc:mysql://localhost/jFinal_test", "root", "333");
        me.add(dp);
        ActiveRecordPlugin arp = new ActiveRecordPlugin(dp);
        arp.setDbProFactory(configName -> new MyDbPro(configName));
        /**
         * 目前ActiveRecordPlugin提供了MysqlDialect、OracleDialect、PostgresqlDialect、SqlServerDialect、Sqlite3Dialect、AnsiSqlDialect实现类
         */
        arp.setDialect(new MysqlDialect());
        arp.addSqlTemplate("add.sql");

        Engine engine = arp.getEngine();
//        engine.setCompressorOn(' ');
        engine.setCompressorOn('\n');
        me.add(arp);
        arp.addMapping("user", User.class);
    }

    @Override
    public void configInterceptor(Interceptors me) {
        // 以下两行代码配置作用于控制层的全局拦截器
//        me.add(new AuthInterceptor());
//        me.addGlobalActionInterceptor(new AaaInterceptor());

        // 以下一行代码配置业务层全局拦截器
//        me.addGlobalServiceInterceptor(new BbbInterceptor());
    }
    @Override
    public void configHandler(Handlers me) {
//        me.add(new ResourceHandler());
    }

    /**
     * 系统启动完成后的回调
     */
    @Override
    public void onStart() {
        super.onStart();
    }

    /**
     * 系统关闭之前的回调
     */
    @Override
    public void onStop() {
        super.onStop();
    }
}
